package com.sangeng.utils;

import com.sangeng.domain.entity.Article;
import com.sangeng.domain.vo.HotArticleVo;
import org.springframework.beans.BeanUtils;

import java.util.List;
import java.util.stream.Collectors;

/*
* bean拷贝，**Vo类生成
* */
public class BeanCopyUtils {

//    构造方法
    private BeanCopyUtils() {
    }

//  Bean拷贝  (拷贝对象，另外一个对象===>将source拷贝给clazz) 字节码的反射方式创建我们的目标对象，再实现拷贝。
//    泛型是 V，V什么时候确定：根据传进来的字节码对象确定。 同时方法的返回值类型也用V来表示。
    public static<V> V copyBean(Object source,Class<V> clazz) {
        //        创建目标对象---空参构造
        V result = null;
        try {
            result = clazz.newInstance();
            //        实现属性拷贝
            BeanUtils.copyProperties(source, result);
        } catch (Exception e) {
            e.printStackTrace();
        }
        //        返回结果
        return result;

    }

//    返回值类型是List<V> ,传进来的是List集合[右], 传进来的字节码 ， 最终返回的是List集合的泛型V
    public static <O,V> List<V> copyBeanList(List<O> list,Class<V> clazz){
//        map:流当中元素的转化:copyBean来转化。
//        collect:转化成集合
        return list.stream()
                .map(o -> copyBean(o, clazz))
                .collect(Collectors.toList());

    }

//    用main方法测试一下
    public static void main(String[] args) {
        Article article =new Article();
        article.setId(1L);
        article.setTitle("aa");

        HotArticleVo hotArticleVo =copyBean(article,HotArticleVo.class);
        System.out.println(hotArticleVo);
    }
}
